package com.crm.service.contactManager;

import com.crm.model.entity.contactManager.Contact;
import com.crm.model.entity.contactManager.ContactErrorRecord;
import com.crm.model.entity.contactManager.ContactExample;
import com.crm.model.entity.contactManager.ContactExchangeCode;
import com.crm.model.entity.systemManager.SysParameterSetting;
import com.crm.model.qo.contactManager.ContactFollowPlanTimeQO;
import com.crm.model.qo.contactManager.ContactQO;
import com.crm.model.vo.contactManager.*;

import java.util.Date;
import java.util.List;

/**
 * 联系人管理信息
 */
public interface ContactDbService {

    /**
     * 联系人管理信息
     * @param contactQO  查询条件
     * @param sortOrder  排序字段,类型
     * @return
     */
    //List<ContactVO> selectContactList(ContactQO contactQO, String sortOrder);

    /**
     * 联系人管理信息   ----超级管理员
     *
     * @param contactQO 查询条件
     * @param toString  排序字段,类型
     * @return
     */
    List<ContactVO> selectContactGlyList(ContactQO contactQO, Integer dateUnit, String toString);

    /**
     * 联系人管理信息   ----分公司普通管理员
     *
     * @param contactQO 查询条件
     * @param toString  排序字段,类型
     * @return
     */
    List<ContactVO> selectContactFgsList(ContactQO contactQO, Integer dateUnit, String toString);

    /**
     * 联系人管理信息   ----普通用户
     *
     * @param contactQO 查询条件
     * @param toString  排序字段,类型
     * @return
     */
    List<ContactVO> selectContactPtyhList(ContactQO contactQO, Integer dateUnit, String toString);

    /**
     * 客户详情-新增联系人-名字重复问题     联系人管理表
     *
     * @param customerId         客户id
     * @param contactName        联系人名称
     * @param contactInformation 联系方式
     * @param contactNature      联系人性质  0企业联系人  1个人联系人
     * @param accountId 用户id
     * @return
     */
    List<Contact> getCustomerIdAndContactNameAndAccountId(String customerId, String contactName, String contactInformation, String contactNature,String accountId);

    /**
     * 修改联系人管理表
     *
     * @param contact 联系人实体
     * @return
     */
    boolean updateContact(Contact contact);

    /**
     * 联系人-新增联系人
     *
     * @param contact 联系人实体
     * @return
     */
    Boolean addContact(Contact contact);

    /**
     * 修改联系人废止状态
     *
     * @param contact 联系人实体
     * @return
     */
    Boolean updateAbolishStateById(Contact contact);

    /**
     * 联系人-删除  逻辑删除
     *
     * @param contact 联系人实体
     * @return
     */
    Boolean deleteContactById(Contact contact);

    /**
     * 查询联系人--mybatis查询
     *
     * @param contactId 联系人id
     * @return
     */
    Contact selectContactById(String contactId);

    /**
     * (客服部)联系人管理-联系人维护-修改联系人查询联系人
     * @param contactExample
     * @return
     */
    Contact selectContactByExample(ContactExample contactExample);

    /**
     * 通过联系人id查询联系人详情信息
     *
     * @param contactId 联系人id
     * @return
     */
    ContactVO selectContactDetailById(String contactId);

    /**
     * 商机-新增商机-通过客户id查询联系人列表
     *
     * @param customerId 客户id
     * @return
     */
    List<Contact> contactByCustomerIdList(String customerId);

    /**
     * 根据联系人名称和联系方式判重，是否插入联系人管理
     *
     * @param contactName        --联系人姓名
     * @param contactInformation --联系方式
     * @return {@link {java.lang.Boolean}}
     * @Author pym
     * @Date 2021/3/4 14:58
     */
    Boolean isInsertContact(String contactName, String contactInformation);

    /**
     * 联系人-新增联系人--同一客户下联系人重名-->合并联系方式
     *
     * @param customerId    客户id
     * @param contactName   联系人姓名
     * @param contactNature 联系人性质  0企业联系人  1非企业联系人
     * @param accountId     当前登录人
     * @return
     */
    List<Contact> getContactName(String customerId, String contactName, String contactNature, String accountId);

    /**
     * 联系人-客户详情-联系人列表-跳转联系人详情
     *
     * @param customerId         客户id
     * @param contactInformation 联系方式
     * @param contactName        联系人姓名
     * @return
     */
    Contact getContactId(String customerId, String contactInformation, String contactName);

    /**
     * 商机-新增商机-过客户id查询联系人列表  分页
     *
     * @param customerId 客户id
     * @param order      分组
     * @return
     */
    List<Contact> pageContactByCustomerIdList(String customerId, String order);

    /**
     * 查询联系人里面有的行业
     *
     * @param name   登录人
     * @param number 0超管 1普通管理员  2普通用户
     * @return
     */
    List<IndustryAreaVO> selectIndustry(String name, Integer number);

    /**
     * 查询联系人里面有的地图
     *
     * @param name   登录人
     * @param number 0超管 1普通管理员  2普通用户
     * @return
     */
    List<IndustryAreaVO> selectProvince(String name, Integer number);

    /**
     * 根据客户ID更新联系人所有人ID、分公司ID
     *
     * @param customerId     -客户ID
     * @param accountId      -用户ID
     * @param companyId      -公司ID
     * @param updatePeopleId -更新人ID
     * @param updateTm       -更新时间
     * @return {@link {java.lang.Boolean}}
     * @Author pym
     * @Date 2021/4/8 15:50
     */
    Boolean updateContactByCustomerId(String customerId, String accountId, String companyId,
                                      String updatePeopleId, Date updateTm);


    /**
     * @Description: 按天统计时间段内新增联系人
     * @Param: [startTime, endTime]
     * @Return: java.util.List<com.crm.model.vo.contactManager.ContactStatisticsVO>
     * @Author: lixq-f
     * @Date: 2021/4/16
     **/
    List<ContactStatisticsVO> statisticsNewContactByDay(String startTime, String endTime,
                                                        String accountId);


    /**
     * @Description: 按月统计本年度新增联系人
     * @Param: [startTime, endTime]
     * @Return: java.util.List<com.crm.model.vo.contactManager.ContactStatisticsVO>
     * @Author: lixq-f
     * @Date: 2021/4/16
     **/
    List<ContactStatisticsVO> statisticsNewContactByMonth(int thisYear, String accountId);

    /**
     * 根据客户ID和联系方式查询联系人信息
     * @Author pym
     * @Date  2021/5/10 14:43
     * @param customerId 客户ID
     * @param contactInformation 联系方式
     * @return {@link {com.crm.model.entity.contactManager.Contact}}
     */
    Contact getContact(String customerId, String contactInformation);

    /**
     * 根据客户id、姓名、手机号查询有没有这个联系人
     * @param customerId
     * @param contactPerson
     * @param contactPersonPhone
     * @return
     */
    ContactVO isInsertContactPerson(String customerId, String contactPerson, String contactPersonPhone);

    /**
     * 新增个人客户根据手机号查询联系人是否存在
     * @Author pym
     * @Date  2021/6/11 10:18
     * @param contactInformation 联系方式
     * @return {@link {java.lang.Boolean}}
     */
    Boolean getContactByContactInformation(String contactInformation);

    /**
     * 呼叫中心根据手机号和账号Id查询联系人
     * @Author pym
     * @Date  2021/6/11 14:44
     * @param contactInformation 联系方式
     * @param accountId 账号Id
     * @return {@link {com.crm.model.entity.contactManager.Contact}}
     */
    Contact getContactByContactInfoAndId(String contactInformation, String accountId);

    /***
     * 根据客户id、联系人姓名查询联系人信息
     * @param customerId 客户id
     * @param contactName 联系人姓名
     * @Author: luojie
     * @Date: 2021/6/15 9:46
     */
    Contact getContactByCustomerIdAndContactName(String customerId, String contactName);

    /**
     *查询联系人信息
     * @param customerId 客户id
     * @param contactName 联系名称
     * @param information 联系方式
     * @param s  contactNature  联系人性质  0
     * @param accountId 用户id
     * @param companyId 分公司id
     * @return
     */
    List<Contact> getCustomerIdAndContactNameAndAccountIdAndCompanyId(String customerId, String contactName, String information, String s, String accountId, String companyId,String csd);

    /**
     *新增联系人导入错误记录
     * @param contactErrorRecord
     * @return
     */
    Boolean insertContactErrorRecord(ContactErrorRecord contactErrorRecord);

    /**
     *通过联系人id查询联系人信息
     * @param contactId 联系人id
     * @param accountId 账号id
     * @param companyId 公司id
     * @return
     */
    List<Contact> selectMyContactsByContactId(String contactId,String accountId,String companyId);

    /**
     * 通过客户id查询客户信息
     * @param customerId 客户id
     * @param accountId 账号id
     * @param companyId 公司id
     * @return
     */
    List<Contact> selectMyContactsByCustomerId(String customerId,String accountId,String companyId);

    /**
     * 根据公司id查询联系人
     * @param companyId 公司id
     * @return
     */
    List<Contact> selectCompanyId(String companyId,int contactNature);

    /**
     * 根据公司id和联系人性质 企业联系人
     * @param companyId 客户id
     * @return
     */
    List<ContactRepeatVO> selectContactrepeat(String companyId);

    /**
     * 客户导入判断联系人是否存在
     * @Author pym
     * @Date  2021/7/2 15:02
     * @param customerId 客户Id
     * @param contactInformation 联系方式
     * @param contactName 联系人姓名
     * @param contactNature 联系人性质
     * @return {@link {com.crm.model.entity.contactManager.Contact}}
     */
    Contact isContactRepeat(String customerId, String contactInformation, String contactName, Integer contactNature);

    /**
     * 客户详情-新增联系人-名字重复问题   联系人管理表
     * @param customerId  客户id
     * @param contactName 联系人名称
     * @param information 联系方式
     * @param s 联系人性质  0企业联系人  1个人联系人
     * @param accountId 用户id
     * @return
     */
    List<Contact> getCustomerIdAndContactNameAndAccountIdAndCompanyIds(String customerId, String contactName, String information, String s, String accountId, String companyId);

    /**
     * 获取客户对应的联系人
     * @Author pym
     * @Date  2021/8/5 16:25
     * @param customerId 客户Id
     * @return {@link {java.util.List<com.crm.model.entity.contactManager.Contact>}}
     */
    List<Contact> getContactByCustomerId(String customerId);

    /**
     * 新增联系人兑换码
     * @param contactExchangeCode 兑换码
     */
    Boolean addContactExchangeCode(ContactExchangeCode contactExchangeCode);

    /**
     * 查询系统设置
     * @return
     */
    SysParameterSetting selectContactCodeStatus();

    /**
     * 兑换码列表
     * @param contactId 联系人id
     * @param order 分组
     * @return
     */
    List<ContactExchangeCodeVO> selectContactExchangeCodeList(String contactId, String order);

    /**
     * 开启关闭联系人发码
     * @param sysParameterSetting 联系人发码状态  0发码 1不发码
     * @return
     */
    Boolean updateContactcodeStatus(SysParameterSetting sysParameterSetting);

    /**
     * 通过联系方式和兑换码查询
     * @param contactInformation 联系方式
     * @param code 兑换码
     * @return
     */
    ContactExchangeCode selectContactExchangeCodeByInformationAndCode(String contactInformation, String code);

    /**
     * 判断该客户下是否有此联系电话
     * @Author renshaorong
     * @Date 2021/10/21
     * @param customerId
     * @param contactPhone
     * @return
     */
    Integer checkExist(String customerId, String contactPhone);

    /**
     * 查询联系人里面有的标签
     * @param name
     * @param number 0 超管 1普管 2普通
     * @return
     */
    List<String> selectTag(String name, Integer number);

    /**
     * 新增跟进计划时间
     * @param qo
     * @return
     */
    Boolean addContactFollowPlanTimes(ContactFollowPlanTimeQO qo);

    /**
     * 查询客户下的其他联系人
     * @param customerId   客户Id
     * @return
     */
    List<Contact> selectOtherContactByCustomerId(String customerId, String contactId,String accountId,String companyId);

    /**
     * 修改跟进计划时间
     */
    List<Contact> selectLessDayFollowPlanTime(String date);

    /**
     * 跟进计划时间清空
     * @param contact
     * @return
     */
    Boolean updateContactFollowPlanTime(Contact contact);
}
